home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgramD2.iso
/
Borland
/
Borland C++ V5.02
/
DOC.PAK
/
ADDON.TXT
next >
Wrap
Text File
|
1997-05-06
|
18KB
|
468 lines
ADDON.TXT For BCWADDON.DLL v1.02 doc rev 1.7 7/4/96
Note: v1.02 of bcwaddon.dll corresponds with v5.01 of BCW
BCW 5.0 AddOn Interfaces
------------------------
The BCW AddOn Interfaces provide a mechanism to help achieve tight integration
between a third party addon application and the BCW C++ IDE. The interfaces
are implemented using the OLE COM model and a basic understanding of COM
is essential to developing an addon using these interfaces. This document
doesn't attempt to explain COM or cover all the interfaces in great detail.
It does provide an an overview of the types of services available and how to
get started. In many cases, detailed reference material is provided in the
header files. In some cases, it may be necessary to take a close look at the
provided examples, since the documentation may not be complete yet.
Several of the interfaces have been brought forward from BC4.5's IDEHOOK
implementation. They have minor changes that allow them to conform to
a new set of rules and to behave more like the new interfaces. In most
cases, if you have code that used IDEHOOK, that code can be brought forward
without any major restructuring.
As we add features and services to the addon wrapper dll, we will surface new
interfaces to access those services, while leaving the old interfaces intact.
AddOn Requirements:
- Addons must be written as Win32 DLL's and will be loaded by the IDE's process
(BCW.EXE) when properly registered with the system as being a BCW addon.
- Addons must be written in a language that supports COM interfaces
Notes:
- At the time of this writing, only C++ headers are provided.
- It is not required that the addon dll be written using OWL or be built
using Borland tools.
- As an addon developer, you should be familiar with the concept and rules of
reference counting as it is used in OLE programing. You should also have at
least some familiarity with COM interfaces.
Services exposed through the AddOn interfaces
- Commands and Menus
- View mgmt
- Editor buffers
- Virtual file system
- Make engine
- Addon pages for option dialogs (MPD's)
- Project mgmt
- Status bar
- Script engine
- Target options
- Tool mgmt
- Custom Targets
- Message window output
Known bugs and bug fixes
------------------------
1) (not yet fixed) You must compile and link into your dll a provided file
ADDON.RC if you are creating MPD pages. This file can be found in the
include\ideaddon directory.
2) (FIXED in v1.01) The top level project node sometimes returns info for its
first child instead of itself.
3) (FIXED in v1.02 - see IPOLYSTR.H comment below) Only the "Cstr" methods of
IPolyString are currently hooked up.
4) (FIXED in v1.01) When using the NewFileMessage() or NewMessage() methods of
IMessageFolder, passing strings to the pMsg argument larger than 230 bytes in
length will crash BCWADDON.DLL. We will fix this in a patch, but for now you
must truncate the strings before creating the poly string object that gets
passed to the method.
5) (FIXED in v1.01) Destructors on interface objects weren't being called when
the object's ref count reached zero.
6) (FIXED in v1.01) There was to prevent restoration of an addon view on a
subsequent project open (see new comment above IViewClient::GetRestoreDataLen()
in iview.h).
7) (FIXED in v1.01) Allow the creation of new tabs (as documented) when
creating a new message window folder (imsgsys.h).
8) (FIXED in v1.01) Using IVirtualFile, Exists() required a previous call to
Open() and Close() was not automatically called when the ref count reached
zero - they now behave as documented in ivfile.h.
9) (FIXED in v1.02) Several IEditorServer methods weren't working correctly:
backspace(), raise_anchor(), delete_to_eol(), page_down(), page_up(). This
has been fixed.
10) (FIXED in v1.02) Addon MPD pages with conflicting resource IDs would
sometimes cause a page to fail to repaint.
11) (FIXED in v1.02) New BC5 lib types were not represented in ITARG.H.
12) (FIXED in v1.02) The doc in IEDITOR.H was misleading, since it was always
necessary to call set_buffer() after any call to begin_edit() and this was not
stated in the doc. This is still the desired calling sequence, but protection
has been built into begin_edit() to make the call to set_buffer() non-essential
in cases where the correct buffer is already current.
13) (FIXED in v1.02) The return from AddRef() on interface objects in
BCWADDON.DLL and those created with IUnknownImpl was the refcount before the
AddRef() instead of after.
14) (FIXED in v1.02) The speedbar editor in Options/Environment would display
bitmaps for commands that had no bitmap associated with them. Now, commands
with no associated bitmap will not show up in the speedbar editor at all. In
other words, commands for which ICommand::SetIcons() is never called will not
appear in the speedbar.
15) (FIXED in v1.02) An add-on's view managed window, in cases where it was the
only opened view in the IDE, would sometimes hang or crash when the user would
try to access the file or edit menus.
16) (FIXED in v1.02) The GUID variable names in itx.uid were misspelled and
didn't adhere to the convention used in the comhelp.h macros. The fix to this
is to continue to support the old names through macro definitions while
correcting the mistake.
17) (FIXED in v1.02) Fixed crash bug involving ev_notify messages for Win95
Common Controls that happen to be placed in mpd pages.
18) (FIXED in v1.02) ITargetServer::TargetAdd() and ConvertNodeToTarget() were
not working correctly for 16 bit DOS targets, this has been fixed.
19) (FIXED in v1.02) IProjectClient::CloseNotify() was being called
prematurely, giving the user the opportunity to cancel the close after this
method had been called. The timing has been adjusted so that the CloseNotify()
happens later in the cycle when there is no possibility of the close being
aborted.
New In 5.01
-------------------
COMHELP.H
Added QUERY_INTERFACE() macro, see EXAMPLES\IDE\ADDON\TESTBED\PRJVIEW.CPP for
an example usage.
IVIEW.H
Added IViewType2 interface for extended view display name and family name
support (see comments in IVIEW.H along with the definition of IViewType2).
IPOLYSTR.H
Hooked up BSTR support. Decided to cop out on Delphi string support, since
this would be of limited added convenience or performance improvement over
just doing the conversion to or from 'c' strings in your Delphi code.
ITOOL.H
Two new flags have been added to support having your tool appear on the File|New
submenu or having your tool appear in the viewer list in the File|Open
dialog. They are TIFlag_OnFileNewMenu and TIFlag_OnFileOpenMenu.
IPROJ.H
IProjectServer2 exposes node flags, see iproj.h for more details
IMSGSSYS.H
Added IMessageSystem2 and IMessageClient for hooking an action request on a
message - suitable for use by a third party source editor that wants to handle
user double-clicks on error messages. See imsgsys.h for more info, also see
the example in bc5\examples\ide\addon\testbed\msgcli.h and .cpp.
Add IMessageFolder2, which adds support for including a help file and context
id when creating a message. See the imsgsys.h for more info, and the example
in bc5\examples\ide\addon\testbed\msgtest2.h and .cpp.
IPRSET.H
Added IPrinterSettings interface for determining the current printer settings
when they have been changed from the default via the Printer Setup dialog box.
See iprset.h for details. See bc5\examples\ide\addon\testbed\prset.cpp and .h
for example code.
IPROJ.H
Added IProjectSaveClient. This is directly related to bugfix #19 above.
Now that CloseNotify() is being called at the right time, it is no longer
effective to remove add-on tools in response to CloseNotify(). It is harmless
to do so, but it is too late for the changed toolset to be saved with the
project. To remedy the situation, IProjectSaveClient has been added, which
calls the add-on right before a project is saved and again right after it has
been saved. See IPROJ.H for more details.
New in 5.02
-----------
IIDEUI.H
Added IIdeUI interface to allow addon's access to the IDE's set of message boxes.
ISTATUS.H
Added IStatusDialog interface to give addon's access to the IDE's status dialog.
ITOOL.H
Added IToolInfo3 interface to allow addon's to retrieve the IStatusDialog interface.
IPROJ.H
Added IProjectServer3 interface. This interface gives addon's the ability to move
and copy individual nodes; set the translator on a specific node; retieve the
autodependency information of a specific node; and set the dirty flag for a node.
See IPROJ.H for details.
IEDITOR.H
Added IEditorServer2 to give addon's ability to have IDE reload an edit buffer from
disk.
C++ IDE AddOn Interfaces
------------------------
File Locations
Addon wrapper dll: bc5\bin\bcwaddon.dll
Examples: bc5\examples\ide\addon\testbed
Interfaces: bc5\include\ideaddon
Registry tool: bc5\bin\addonreg.exe
Getting Started
---------------
- Registering your dll at install time -
Add your addon dll key in the registry under the following key:
HKEY_LOCAL_MACHINE
SOFTWARE
Borland
Borland C++
5.0
IDE
AddOns
(addon client keys...)
Key: "testbed example" (the name of your addon)
Value: "Path" Data: "c:\bc5\bin\exaddon.dll" (full path to your dll)
Value: "Enabled" Data: "Yes"
During development, you can use addonreg.exe to quickly add, delete, enable
and disable addon registry entries (or to see exactly what the entry should
look like).
exaddon.dll (used in the above example) is our example testbed, which weÆll
talk about in a minute.
Your dll MUST have one special entry point, which bcwaddon.dll will call to
let you know that the IDE is waking up and shutting down:
extern "C" void WINAPI __export BcwAddOnEntry( IIdeServer * pIdeServer ) {
if ( pIdeServer ) { // the ide is waking up
SetIdeServer( pIdeServer )
// do initialization stuff here...
}
else { // the ide is shutting down
// do cleanup stuff here...
ReleaseIdeServer();
}
}
The code for SetIdeServer(), ReleaseIdeServer() and other handy things is
provided in comhelp.h/cpp, which can be found in the include\ideaddon
directory.
Once your dll is registered, the addon wrapper, BCWADDON.DLL, will dynamically
load your dll at startup time and call BcwAddOnEntry(). There is no way to
specify that your dll will be loaded in any particular order with respect to
other addon dll's. Once your dll is loaded, you can schedule scripts to run
and register to receive events via one or more client interfaces. Server
interfaces are provided to call into the IDE and to register client
interfaces. All server interfaces are available by querying the IIdeServer
pointer passed in to BcwAddOnEntry() or through the macro GET_INTERFACE().
- Testbed -
Since weÆre trying to be efficient, we thought weÆd combine the concept of
example code with smoke testing and bug reproduction. We set up a small test
framework for which we are providing source code (see the examples directory).
As we add tests, they will appear in the source that is delivered to you.
The testbed is built in the examples\ide\addon\testbed directory.
To build and install the testbed:
- Open the exaddon.ide project and build it
- Copy exaddon.dll to your bc5 bin directory
- Copy the *.spp files to your bc5 script directory
- From the bin directory, launch ADDONREG.EXE and create a new entry
for exaddon.dll (pointing to the copy in the bin directory).
- Shut down the ide and start it up again.
If properly installed, you should see a dialog box appear just before BCW does.
From this dialog box, you can select a test object and run up to 4 sub-tests
once the object has been initialized (with the initialize button). To run
another set of tests, uninitialize the current object and select another one. An
output window is right there in the dialog box which shows debug messages
generated from exaddon.dll.
It is very easy to add your own tests to this framework. The test
harness is heavily commented in some places. See examples\tests.h/cpp and
option.h/cpp to get started. A more advanced example is in project.h/cpp.
One test which covers a lot of ground is the view management test.
YouÆll also notice some macros from include\ideaddon\comhelp.h used in these
examples to make the COM implementation simpler.
- Interfaces -
The interfaces are all in the include\ideaddon directory. YouÆll notice that
weÆre using IPolyString whenever strings need to be passed across the
interface. There are helper functions in use to make this easier to deal with.
We need to stay away from using C++ constructs or structs across the interface
and want to be able to accommodate BSTR usage (and Pascal strings) with a
minimum of conversion overhead, hence, the IPolyString interface. Be sure to
read the doc in ipolystr.h before using them. (Note: only the 'c' string
methods have been implemented at the time of this writing, the others are
no-ops).
- Script Interface -
There are many ways to talk with the IDE through the IDEÆs Object Script
implementation and the script interface provides a way to run individual script
commands and entire scripts through the AddOn interface. When the IDE is first
coming up, you can schedule your startup script through the
ScheduleScriptFile() method. You can issue short commands through
RunScriptCommand() and load and unload script files with RunScriptFile() and
UnloadScriptFile(). This is quite powerful, since you can expose flat function
calls in your dlls that can be called directly from script and a lot of the
internal APIÆs are already exposed as script objects. (Please take note
of the warning in iscript.h regarding calling script from within anything
but the UI thread).
Interface Overview
------------------
IPolyString
Utility used for string conversion-on-demand, ref counting/ownership
Supports: c-style strings (pascal strings and BSTR support coming soon)
File: IPolyStr.h
IIde
Exposes: Application-wide methods, access to all server interfaces through
QueryInterface, and creation of miscellaneous object instances.
File: IIde.h
IScriptServer
Exposes: Access to the script engine
File: IScript.h
Notes:
Run or schedule script files, issue script commands.
IProjectServer, IProjectClient, IProjectNodeInfo
Exposes:
Project node attributes
Node Iteration, Find by name
Custom node properties
Events: Open, Close, NodeAdd/Delete and others
Node Add/Remove
Selected nodes
File: IProj.h
ICommand, ICommandServer
Exposes: Command creation, management
File: ICmd.h
Notes:
Enabler callback
Command implemented in script, can call back to your dll
Can register icon for speedbar
IMenuItem, IMenuClient, IMenuServer
Exposes: Frame, Project and Editor menus
File: IMenu.h
Notes:
Hook up menu items to ICommand objects
Event when a menu is about to open
IViewClient, IViewParentWnd, IUserViewFactory, IViewType
Exposes: Addon view management
File: IView.h
Notes:
Addon windows become descendants of an ide mdi client
Restore opportunity, your restore data saved with ide project
Polymorphic command support
View type can be added to the Font and Color property page list
View is managed (tile, cascade, etc.)
IMpdPage, IMpdChapter, IMpdServer
Exposes: Project and environment option dialogs
File: IMpd.h
Notes:
Addon chapters and pages for MultiPageDialog's
(Chapter contains one or more pages)
Project MPD's are node-specific
OnCommand() event for mgmt, or can subclass
IStatusBar
Exposes: Ability to write text to status bar, status bar hwnd
File: ISBar.h
IToolImplementor, IToolInfo, IToolServer
Exposes: Tool mgr
File: ITool.h
Notes:
Invoke any registered tool
Find tool by name
Register Addon callbacks as tools
Register standalone tools
IVirtualFile
Exposes: Virtual file system
File: IVFile.h
Notes:
Low-level file routines
Edit buffers are used for READING of files already loaded into an edit buffer
Disk files are used otherwise
IEditorServer
Exposes: Editor
File: IEditor.h
Notes:
Create and delete edit buffers
Manipulate text in buffer
Line editing
Iterate open buffers
Create system (hidden) buffers
Save a buffer to disk
Regular expression searching and translation
Behavior can't be overridden in script
Undo/Redo access
IMakeClient, IMakeServer
Exposes: Access to the make engine
File: IMake.h
Notes:
Make Begin and End events
Node input/output age
Make node(s)
IOptionServer
Exposes: Build options for a node
File: IOption.h
Notes:
Set/Get the following build options:
Include path spec
Library path spec
Source path spec
Intermediate output path
Final output path
#defines
Command line override
ITargetServer
Exposes: Target add, query
File: ITarg.h
Notes:
Add a specified target
Get target attributes
Find a node's target
IMessageSystem, IMessageFolder
File: iMsgSys.h
Notes:
Allows you to Post messages to a folder in the message window
ITargetManager
File: iTx.h
Notes:
Use this and the other interfaces in itx.h to create a custom target type
that will appear in the TargetExpert
Important Note
--------------
In order to provide you with the most comprehensive product information,
updates, and service possible with this new release of Borland C++ and its
associated products we are providing several online resources.
For the location of these resources and information on contacting Borland and
support services offered by Borland, please read the file 'README.TXT' in your
\BC5 directory.